package com.zjht.gmcc.bean.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.zjht.gmcc.bean.model.IMEILimit;
import com.zjht.gmcc.bean.util.MyConstant;
import com.zjht.gmcc.bean.util.MyFormat;

/**
 * IMEI处理相关方法
 * @author dyh 2011-01-09
 */
public class IMEIUtil implements java.io.Serializable {
	private static final long serialVersionUID = 1923159818657052800L;

	// IMEI可用状态
	public static final String VALIDFLAG_OK = "1";// 在库
	public static final String VALIDFLAG_BAD = "0";// 在途
	public static final String VALIDFLAG_LOCK = "2";// 锁定

	// IMEI相关模块名称
	public static enum IMEIModule { 
		IMEI_SEARCH, // IMEI批量查询
		IMEI_PREPARE_SEARCH, // 厂家备案IMEI批量查询
		IMEI_DH, // IMEI到货
		IMEI_PREPARE, // IMEI备案(厂家)
		IMEI_PREPARE_GMCC, // IMEI备案(省移动)
		IMEI_DETAIL,
		// IMEI明细(库存、销售)
		IMEI_ZD
		// 终端公司
	};

	public static Map<IMEIModule, IMEILimit> hIMEILimit = new HashMap<IMEIModule, IMEILimit>();// IMEI限制条件

	/**
	 * 初始化IMEI限制对象
	 * @author dyh 2011-1-11
	 */


	/**
	 * 将IMEI加入到ArrayList
	 * @author dyh 2010-12-30
	 * @param IMEI
	 * @param imeilist IMEI集合
	 * @return true:IMEI添加成功;false:由于IMEI已存在于集合中，则未添加
	 */
	public static boolean addIMEI2List(String IMEI, ArrayList<String> imeilist) {
		boolean ok = false;
		if (imeilist != null && !MyFormat.isStrNull(IMEI)) {
			boolean has = false;
			for (String s_imei : imeilist) {
				if (s_imei.equals(IMEI)) {
					has = true;
					break;
				}
			}
			if (!has) {
				imeilist.add(IMEI);
				ok = true;
			}
		}
		return ok;
	}

	/**
	 * 判断IMEI是否合法(不判断IMEI段)
	 * @author dyh 2010-12-30
	 * @param IMEI
	 * @return
	 */
	private static boolean checkIMEI(String IMEI) {
		boolean ok = false;
		if (!MyFormat.isStrNull(IMEI)) {// 1、检测是否为空字符
			IMEI = IMEI.trim();
			int len = IMEI.length();
			if (len == 15 || len == 16) {// 2、检测长度
				Pattern pattern = Pattern.compile("[0-9]{15,16}");// 3、检测是否全部为数字
				Matcher isNum = pattern.matcher(IMEI);
				if (isNum.matches()) {
					ok = true;
				}
			}
		}
		return ok;
	}

	/**
	 * 判断IMEI是否合法
	 * @author dyh 2010-12-30
	 * @param IMEI
	 * @param imeiseg IMEI段(用逗号间隔)
	 * @return
	 */
	public static boolean checkIMEI(String IMEI, String imeiseg) {
		boolean ok = false;
		if (!MyFormat.isStrNull(IMEI) && !MyFormat.isStrNull(imeiseg)) {// 1、检测是否为空字符
			IMEI = IMEI.trim();
			int len = IMEI.length();
			if (len == 15 || len == 16) {// 2、检测长度
				Pattern pattern = Pattern.compile("[0-9]{15,16}");// 3、检测是否全部为数字
				Matcher isNum = pattern.matcher(IMEI);
				if (isNum.matches()) {
					if (imeiseg.indexOf(IMEI.substring(0, MyConstant.IMEISEG_LENGTH)) != -1) {// 4、判断IMEI前六位是否与IMEI段一致
						ok = true;
					}
				}
			}
		}
		return ok;
	}

	/**
	 * 判断IMEI是否合法(将IMEIlist中的IMEI整理到validIMEIlist和invalidIMEIlist)
	 * @author dyh 2011-2-5
	 * @param validIMEIlist 待增加的合法IMEI列表
	 * @param invalidIMEIlist 待增加的非法IMEI列表
	 * @param IMEIlist 待检测的IMEI列表
	 * @param imeiseg IMEI段(多个用逗号间隔)
	 */
	public static void checkIMEI(ArrayList<String> validIMEIlist, ArrayList<String> invalidIMEIlist, String[] IMEIlist, String imeiseg) {
		if (validIMEIlist == null || invalidIMEIlist == null || IMEIlist == null || IMEIlist.length == 0 || imeiseg == null
				|| imeiseg.length() != MyConstant.IMEISEG_LENGTH)
			return;
		Pattern pattern = Pattern.compile("[0-9]{15,16}");// 2、检测是否全部为数字
		Matcher isNum = null;
		boolean ok = false;
		for (String IMEI : IMEIlist) {
			ok = false;
			if (!MyFormat.isStrNull(IMEI)) {// 1、检测是否为空字符
				IMEI = IMEI.trim();
				isNum = pattern.matcher(IMEI);
				if (isNum.matches()) {
					if (imeiseg.indexOf(IMEI.substring(0, MyConstant.IMEISEG_LENGTH)) != -1) {// 3、判断IMEI前六位是否与IMEI段一致
						ok = true;
					}
				}
				if (ok) {
					addIMEI2List(IMEI, validIMEIlist);
				} else {
					addIMEI2List(IMEI, invalidIMEIlist);
				}
			}
		}
	}

	/**
	 * 检查IMEI格式是否正确,返回有效IMEI数量以及IMEI数组(无效IMEI置为"")
	 * @author dyh 2010-12-30
	 * @param arrIMEI
	 * @return 有效IMEI数量
	 */
	public static int getValidIMEICount(String[] arrIMEI) {
		int valid = 0;
		if (arrIMEI != null && arrIMEI.length > 0) {
			for (int i = 0; i < arrIMEI.length; i++) {
				if (checkIMEI(arrIMEI[i])) {
					valid++;
				} else {
					arrIMEI[i] = "";
				}
			}
		}
		return valid;
	}

	/**
	 * 分时段设置IMEI处理数量
	 * @author dyh 2011-1-11
	 * @param module 模块名
	 * @return
	 */
	public static int getIMEICountLimited(IMEIModule module) {
		int count = 0;
		if (module != null) {
			IMEILimit imeilimit = hIMEILimit.get(module);
			if (imeilimit != null) {
				switch (module) {
					case IMEI_SEARCH:
					case IMEI_PREPARE_SEARCH:
						if (MyFormat.isInTime(imeilimit.getBusystarttime(), imeilimit.getIdlestarttime())
								|| MyFormat.isInTime(imeilimit.getIdleendtime(), imeilimit.getBusyendtime())) {
							count = imeilimit.getBusycount();
						} else {
							count = imeilimit.getIdlecount();
						}
						break;
					case IMEI_DH:
					case IMEI_PREPARE:
					case IMEI_PREPARE_GMCC:
					case IMEI_ZD:
						if (MyFormat.isInTime(imeilimit.getBusystarttime(), imeilimit.getBusyendtime())) {
							count = imeilimit.getBusycount();
						} else {
							count = imeilimit.getIdlecount();
						}
						break;
				}
			}
		}
		return count;
	}

	/**
	 * 分时段设置IMEI处理数量
	 * @author dyh 2011-1-11
	 * @param module 模块名
	 * @param isBusy true:忙时限量；false:闲时限量
	 * @return
	 */
	public static int getIMEICountLimited(IMEIModule module, boolean isBusy) {
		int count = 0;
		IMEILimit imeilimit = hIMEILimit.get(module);
		if (imeilimit != null) {
			if (isBusy)
				count = imeilimit.getBusycount();
			else
				count = imeilimit.getIdlecount();
		}
		return count;
	}

	/**
	 * 多个IMEI段分行显示，以防网页变形
	 * @author dyh 2009-11-28
	 * @param imeilist 要格式化的IMEI段(以英文逗号间隔)
	 * @return 每15个IMEI段一行
	 */
	public static String formatIMEISeg(String imeilist) {
		return formatIMEISeg(15, imeilist);
	}

	/**
	 * 多个IMEI段分行显示，以防网页变形
	 * @author dyh 2009-11-28
	 * @param imeicount 每行IMEI段个数
	 * @param imeilist 要格式化的IMEI段(以英文逗号间隔)
	 * @return 每imeicount个IMEI段一行
	 */
	private static String formatIMEISeg(int imeicount, String imeilist) {
		int maxlength = imeicount * 6 + imeicount - 1;
		int len = imeilist.length();
		if (imeilist.endsWith(",")) {
			imeilist = imeilist.substring(0, len - 1);
			len--;
		}
		if (imeilist != null && imeilist.length() > 0 && imeilist.length() > maxlength) {
			StringBuilder imeiok = new StringBuilder();
			int beginIndex = 0;
			int endIndex = 0;
			while (endIndex < len) {
				endIndex += maxlength;
				endIndex = imeilist.indexOf(",", endIndex);
				if (endIndex < 0)
					endIndex = len;
				imeiok.append(imeilist.substring(beginIndex, endIndex));
				if (endIndex < imeilist.length())
					imeiok.append("<br>");
				beginIndex = endIndex + 1;
			}
			return imeiok.toString();
		} else
			return imeilist;
	}

	/**
	 * 多个IMEI分行显示，以防网页变形
	 * @author dyh 2010-04-20
	 * @param imeilist 要格式化的IMEI(以英文逗号间隔)
	 * @return 每imeicount个IMEI一行
	 */
	public static String formatIMEIList(StringBuilder imeilist) {
		String imeilistOk = "";
		if (imeilist != null && imeilist.length() > 0)
			imeilistOk = formatIMEIList(6, imeilist.toString());
		return imeilistOk;
	}

	/**
	 * 多个IMEI分行显示，以防网页变形
	 * @author dyh 2010-04-20
	 * @param imeicount 每行IMEI个数
	 * @param imeilist 要格式化的IMEI(以英文逗号间隔)
	 * @return 每imeicount个IMEI一行
	 */
	private static String formatIMEIList(int imeicount, String imeilist) {
		int maxlength = imeicount * 15 + imeicount - 1;
		int len = imeilist.length();
		if (imeilist.endsWith(",")) {
			imeilist = imeilist.substring(0, len - 1);
			len--;
		}
		if (imeilist != null && imeilist.length() > 0 && imeilist.length() > maxlength) {
			StringBuilder imeiok = new StringBuilder();
			int beginIndex = 0;
			int endIndex = 0;
			while (endIndex < len) {
				endIndex += maxlength;
				endIndex = imeilist.indexOf(",", endIndex);
				if (endIndex < 0)
					endIndex = len;
				imeiok.append(imeilist.substring(beginIndex, endIndex));
				if (endIndex < imeilist.length())
					imeiok.append(",<br>");
				beginIndex = endIndex + 1;
			}
			return imeiok.toString();
		} else
			return imeilist;
	}

	/**
	 * 是否允许导出IMEI明细
	 * @author dyh 2010-07-24
	 * @return 是否允许导出IMEI明细
	 */
	public static boolean canExportIMEI() {
		String time = MyFormat.getCurrentTime();
		time = time.substring(0, 5);
		IMEILimit imeilimit = hIMEILimit.get(IMEIModule.IMEI_DETAIL);
		return (time.compareTo(imeilimit.getIdlestarttime()) > 0 || time.compareTo(imeilimit.getIdleendtime()) < 0);
	}

	/**
	 * IMEI操作时的网页提示
	 * @author dyh 2011-1-11
	 * @return
	 */
	public static String getTip_IMEI(IMEIModule module) {
		StringBuilder tip = new StringBuilder();
		if (module != null) {
			IMEILimit imeilimit = hIMEILimit.get(module);
			if (imeilimit != null) {
				switch (module) {
					case IMEI_SEARCH:
					case IMEI_PREPARE_SEARCH:
						tip.append("<font color='red'>每天");
						tip.append(imeilimit.getBusystarttime());
						tip.append("-");
						tip.append(imeilimit.getIdlestarttime());
						tip.append("与");
						tip.append(imeilimit.getIdleendtime());
						tip.append("-");
						tip.append(imeilimit.getBusyendtime());

						if (imeilimit.getBusycount() <= 0) {
							tip.append("禁止批量查询");
						} else {
							tip.append("每次最多查询");
							tip.append(imeilimit.getBusycount());
							tip.append("个IMEI");
						}
						tip.append("，其他时间");
						if (imeilimit.getIdlecount() <= 0) {
							tip.append("无限制");
						} else {
							tip.append("每次最多查询");
							tip.append(imeilimit.getIdlecount());
							tip.append("个IMEI");
						}
						tip.append("</font>");
						break;
					case IMEI_DH:
					case IMEI_PREPARE:
					case IMEI_PREPARE_GMCC:
					case IMEI_ZD:
						tip.append("<font color='red'>每天");
						tip.append(imeilimit.getBusystarttime());
						tip.append("-");
						tip.append(imeilimit.getBusyendtime());
						if (imeilimit.getBusycount() <= 0) {
							tip.append("禁止操作IMEI");
						} else {
							tip.append("每次最多操作");
							tip.append(imeilimit.getBusycount());
							tip.append("个IMEI");
						}
						tip.append("，其他时间");
						if (imeilimit.getIdlecount() <= 0) {
							tip.append("无限制");
						} else {
							tip.append("每次最多操作");
							tip.append(imeilimit.getIdlecount());
							tip.append("个IMEI");
						}
						tip.append("</font>");
						break;
					case IMEI_DETAIL:
						tip.append("<font color='red'>IMEI明细导出时间为每天");
						tip.append(imeilimit.getIdlestarttime());
						tip.append("-次日");
						tip.append(imeilimit.getIdleendtime());
						tip.append("</font>");
						break;
				}
			}
		}
		return tip.toString();
	}

	/**
	 * IMEI手工输入网页提示
	 * @author dyh 2011-1-11
	 * @param isColor 是否需要区分颜色
	 * @param batchUrl 文件导入URL
	 * @return
	 */
	public static String getTip_Single(boolean isColor, String batchUrl) {
		StringBuilder tip = new StringBuilder();
		tip.append("<br/>IMEI操作说明：<br/>");
		tip.append("　　1.文本框中可输入多个IMEI，每行写一个IMEI(15或16位纯数字)，每行的内容除IMEI外不得有其他字符；<br/>");
		tip.append("　　2.既可手工逐个输入IMEI后按回车换行，也可直接从您本地的EXCEL文件中复制多个IMEI粘贴到文本框中；<br/>");
		if (isColor)
			tip.append("　　3.省移动要求：文本框中IMEI所对应的实物必须是同一款机型同一种颜色；不同颜色的IMEI，必须分批录入。");
		else
			tip.append("　　3.省移动要求：文本框中IMEI必须与实物一一对应。");

		if (!MyFormat.isStrNull(batchUrl)) {
			tip.append("<p><b><a href='");
			tip.append(batchUrl);
			tip.append("'><font color='red'>[点击切换到“文件导入”方式]</font></a></b></p>");
		}
		return tip.toString();
	}

	/**
	 * IMEI文件导入网页提示
	 * @author dyh 2011-1-11
	 * @param isColor 是否需要区分颜色
	 * @param singleUrl 手工输入URL
	 * @return
	 */
	public static String getTip_Batch(boolean isColor, String singleUrl) {
		StringBuilder tip = new StringBuilder();
		tip.append("<br/>IMEI文件说明：<br/>");
		tip.append("　　1.文件格式：必须为文本文件(*.txt),不允许EXCEL等文件格式；<br/>");
		tip.append("　　2.文件内容：每行只能写一个IMEI(15或16位纯数字)，每行的内容除IMEI外不得有其他字符；<br/>");
		if (isColor)
			tip.append("　　3.省移动要求：文本框中IMEI所对应的实物必须是同一款机型同一种颜色；不同颜色的IMEI，必须分批录入。<br/>");
		else
			tip.append("　　3.省移动要求：文本框中IMEI必须与实物一一对应。<br/>");
		tip.append("<br/><br/>“IMEI文本文件”制作技巧：<br/>");
		tip.append("　　1.可使用Windows操作系统自带的“记事本”生成文本文件；<br/>");
		tip.append("　　2.文件内容：既可手工逐个输入IMEI后按回车换行，也可直接从EXCEL复制多个IMEI粘贴到文本文件。");

		if (!MyFormat.isStrNull(singleUrl)) {
			tip.append("<p><b><a href='");
			tip.append(singleUrl);
			tip.append("'><font color='red'>[点击切换到“手工输入”方式]</font></a></b></p>");
		}
		return tip.toString();
	}

	/**
	 * 上网本IMEI手工输入网页提示
	 * @author dyh 2011-1-11
	 * @param isColor 是否需要区分颜色
	 * @param batchUrl 文件导入URL
	 * @return
	 */
	public static String getTip_Single_SN(boolean isColor, String batchUrl) {
		StringBuilder tip = new StringBuilder();
		tip.append("<br/>上网本IMEI和S/N输入说明：<br/>");
		tip
				.append("　　1.文本框中可输入多个IMEI和S/N，每行写一个IMEI(15或16位纯数字)和一个S/N，IMEI和S/N之间用“,”分割(英文逗号)，如：<font color='red'><b>100001234567890,ABCDEZZZZ</b></font>；<br/>");
		tip.append("　　2.既可手工逐个输入IMEI和S/N后按回车换行，也可直接从EXCEL复制多个IMEI和S/N粘贴到文本框中(用英文逗号间隔)；<br/>");
		if (isColor)
			tip.append("　　3.省移动要求：文本框中IMEI所对应的实物必须是同一款机型同一种颜色；不同颜色的IMEI，必须分批录入。");
		else
			tip.append("　　3.省移动要求：文本框中IMEI必须与实物一一对应。");

		if (!MyFormat.isStrNull(batchUrl)) {
			tip.append("<p><b><a href='");
			tip.append(batchUrl);
			tip.append("'><font color='red'>[点击切换到“文件导入”方式]</font></a></b></p>");
		}
		return tip.toString();
	}

	/**
	 * IMEI文件导入网页提示
	 * @author dyh 2011-1-11
	 * @param isColor 是否需要区分颜色
	 * @param singleUrl 手工输入URL
	 * @return
	 */
	public static String getTip_Batch_SN(boolean isColor, String singleUrl) {
		StringBuilder tip = new StringBuilder();
		tip.append("<br/>上网本IMEI和S/N导入文件说明：<br/>");
		tip.append("　　1.文件格式：必须为文本文件(*.txt),不允许EXCEL等文件格式；<br/>");
		tip.append("　　2.文件内容：每行只能写一个IMEI(15或16位纯数字)和一个S/N，IMEI和S/N之间用“,”分割（英文逗号），如：<font color='red'><b>100001234567890,ABCDEZZZZ</b></font>；<br/>");
		if (isColor)
			tip.append("　　3.省移动要求：文本框中IMEI所对应的实物必须是同一款机型同一种颜色；不同颜色的IMEI，必须分批录入。<br/>");
		else
			tip.append("　　3.省移动要求：文本框中IMEI必须与实物一一对应。<br/>");
		tip.append("<br/><br/>“IMEI文本文件”制作技巧：<br/>");
		tip.append("　　1.可使用Windows操作系统自带的“记事本”生成文本文件；<br/>");
		tip.append("　　2.文件内容：既可手工逐个输入IMEI后按回车换行，也可直接从EXCEL复制多个IMEI粘贴到文本文件。");

		if (!MyFormat.isStrNull(singleUrl)) {
			tip.append("<p><b><a href='");
			tip.append(singleUrl);
			tip.append("'><font color='red'>[点击切换到“手工输入”方式]</font></a></b></p>");
		}
		return tip.toString();
	}

	/**
	 * 获取IMEI状态
	 * @author dyh 2011-9-20
	 * @return
	 */
	public static String getIMEIStatus(String validflag, String goodflag) {
		String status = "";
		if ("1".equals(goodflag)) {
			if ("1".equals(validflag)) {
				status = "可用(良品在库)";
			} else {
				status = "不可用(良品在途或锁定)";
			}
		} else {
			if ("1".equals(validflag)) {
				status = "不可用(不良品在库)";
			} else {
				status = "不可用(不良品在途或锁定)";
			}
		}
		return status;
	}

	/**
	 * 获取IMEI状态(用于报表下拉框)
	 * @author dyh 2011-9-20
	 * @return
	 */
	public static String getIMEIStatusForSelect(String validflag, String goodflag) {
		String status = "";
		if (MyConstant.SELECT_FIRST_VALUE.equals(validflag) && MyConstant.SELECT_FIRST_VALUE.equals(goodflag)) {
			status = "全部库存";
		} else {
			if (MyConstant.SELECT_FIRST_VALUE.equals(validflag)) {
				if ("1".equals(goodflag)) {
					status = "全部良品";
				} else {
					status = "全部不良品";
				}
			} else if ("1".equals(validflag)) {
				if ("1".equals(goodflag)) {
					status = "良品在库";
				} else if ("0".equals(goodflag)) {
					status = "不良品在库";
				} else {
					status = "在库";
				}
			} else {
				if ("1".equals(goodflag)) {
					status = "良品在途或锁定";
				} else if ("0".equals(goodflag)) {
					status = "不良品在途或锁定";
				} else {
					status = "在途或锁定";
				}
			}
		}
		if ("0".equals(goodflag) || "0".equals(validflag)) {
			status = "<font color='red'>" + status + "</font>";
		}
		return status;
	}

}